﻿#define  _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>

/*
* 文件操作
* fprintf:格式化输出函数，适用于所有输出流，以文本形式写进文件中
* 函数原型：int fprintf ( FILE * stream, const char * format, ... ); 当stream = stdout（标准输出流）的时候，此时fprintf等价于printf直接打印到屏幕上
* 函数作用：和print类似，只不过多了一个参数，于是将数据打印到屏幕上换到将数据输出到指向的文件指针指向的文件中。
* fprintf和printf和spritf的区别
* fprintf：把数据以格式化的形式打印在指定的输出流中
* printf：把数据以格式化的形式打印在标准输出流中
* sprintf：把格式化的数据转换成字符串
*/

struct s
{
	char name[20];
	int age;
	float score;
};
int main0()
{
	struct s s = { "张三", 20 , 65.5f };

	//想把s中的数据存放到文件中
	//1、打开文件
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//2、写文件 --以文本的形式写进去
	fprintf(pf, "%s %d %f", s.name, s.age, s.score);

	//3、关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

/*
* 文件操作
* fscanf：格式化输入函数，适用于所有输入流
* 函数原型：int fscanf ( FILE * stream, const char * format, ... );当stream = stdin（标准输入流）的时候，此时fscanf等价于scanf
* 函数功能：和scanf输入函数类似，只不过将从键盘上输入转到从文件上进行输入
* fscanf和scanf和sscanf的区别
* fscanf:从指定的输入流中读取格式化的数据
* scanf：从标准输入流上读取格式化的数据
* sscanf：从字符串中读取格式化的数据
*/

int main1()
{
	
	struct s x = { 0 };

	//打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen for read");
		return 1;
	}

	//写入文件
	fscanf(pf, "%s%d%f", x.name, &(x.age),&(x.score));
	
	//打印在屏幕上看看
	printf("%s %d %f", x.name, x.age, x.score);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

//sprintf
int main3()
{
	char buf[200] = { 0 };
	struct s s = { "张三",20,65.5f };
	sprintf(buf,"%s %d %f",s.name,s.age,s.score);
	printf("%s\n",buf);

	struct s t = { 0 };
	sscanf(buf, "%s%d%f", t.name, &(t.age), &(t.score));
	printf("%s %d %f", t.name, t.age, t.score);

	return 0;
}


/*
* fwrite：以二进制形式进行输出，只针对文件输出流
* 函数原型：size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
* ptr：指向一个要被写入的数组
* size：数组每个元素的字节数
* count：数组中存在多少个元素
* stream：二进制文件流
*/

int main4()
{
	//“wb”（只写） 为了输出数据，打开⼀个⼆进制⽂件
	FILE* pf = fopen("text.txt", "wb");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	int arr[] = { 1,2,3,4,5 };
	fwrite(arr, 4, 5, pf); //以二进制形式写入


	fclose(pf);
	pf = NULL;

	return 0;
}


//以二进制形式读取
/*
* fread:以二进制形式进行输入，只针对文件输入流
* fread 返回值为读取成功的个数
*/

int main()
{
	int arr[20] = { 0 };

	FILE* pf = fopen("text.txt", "rb");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}

	//读取
	/*fread(arr, 4, 20, pf);
	int i = 0;
	for (i = 0; i < 20; i++)
	{
		printf("%d ",arr[i]);
	}*/

	int i = 0;
	while (fread(&arr[i], sizeof(int), 1, pf))
	{
		printf("%d ", arr[i]);
		i++;
	}
	
	fclose(pf);
	pf = NULL;
	return 0;
}